package com.kingzoder.food.common.base;

import com.kingzoder.food.common.base.page.PageResultVO;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.List;

/**
 * 基础控制器接口，支持不同操作使用不同的DTO对象
 *
 * @param <T>                    实体类泛型（用于查询返回）
 * @param <ID>                   主键类型
 * @param <SEARCH_DTO>           搜索操作的DTO类型
 * @param <ADD_DTO>              添加操作的DTO类型
 * @param <UPDATE_DTO>修改操作的DTO类型
 * @author ZoderKing
 */
public interface BaseController<T, DETAIL_VO extends Serializable, SEARCH_DTO, ADD_DTO, UPDATE_DTO> {

    /**
     * 分页查询
     *
     * @param pageNum  页码
     * @param pageSize 每页条数
     * @param queryDTO 查询条件DTO
     */
    @GetMapping("/page")
    PageResultVO<List<T>> queryPage(SEARCH_DTO queryDTO);

    /**
     * 根据ID查询单个对象
     */
    @GetMapping("/{id}")
    ResultVO<DETAIL_VO> queryOne(@PathVariable(name = "id") Long id);

    /**
     * 添加操作，使用专门的添加DTO
     */
    @PostMapping
    ResultVO<Boolean> add(@RequestBody ADD_DTO addDTO);

    /**
     * 修改操作，使用专门的修改DTO
     */
    @PutMapping
    ResultVO<Boolean> edit(@RequestBody UPDATE_DTO updateDTO);

    /**
     * 删除操作
     */
    @DeleteMapping("/{id}")
    ResultVO<Boolean> remove(@PathVariable(name = "id") Long id);
}
